package handler.impl;/*
 * @auther 顶风少年
 * @mail dfsn19970313@foxmail.com
 * @date 2020-01-10 15:21
 * @notify
 * @version 1.0
 */

import handler.ParameterHandler;
import mapping.Configuration;
import mapping.MappedStatement;
import mapping.ParameterMapping;
import utils.SimpleTypeRegistry;

import java.lang.reflect.Field;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.List;
import java.util.Map;

public class DefaultParameterHandler implements ParameterHandler {

    @Override
    public void handleParameter(Statement statement,MappedStatement mappedStatement,Object param) throws Exception {
        PreparedStatement preparedStatement = (PreparedStatement) statement;
        //查询入参的类型
        Class<?> parameterTypeClass = mappedStatement.getParameterTypeClass();
        //如果入参类型是简单类型，那肯定就一个 ? 可以直接设置值
        if (SimpleTypeRegistry.isSimpleType(parameterTypeClass)) {
            preparedStatement.setObject(1, param);
        } else if (parameterTypeClass == Map.class) {//map类型
            //TODO
        } else { //pojo类型
            //拿到statement的 ? 的集合
            String sql = mappedStatement.getSqlSource().getBoundSql(param).getSql();
            List<ParameterMapping> parameterMappings = mappedStatement.getSqlSource().getBoundSql(param).getParameterMappings();
            //循环 ?
            for (int i = 0; i < parameterMappings.size(); i++) {
                //拿到每一个 ？ 的包装对象
                ParameterMapping parameterMapping = parameterMappings.get(i);
                //获取参数名
                String name = parameterMapping.getName();
                //通过入参的对象的Class，反射拿到属性
                Field field = parameterTypeClass.getDeclaredField(name);
                field.setAccessible(true);
                //拿到实参的属性值
                Object o = field.get(param);
                //TODO 此处可根据 parameterMapping 中的 ？ 类型使用具体的 setString 。。。
                //设置到 ？ 中
                preparedStatement.setObject(i + 1, o);
            }
        }
    }

}
